package org.truenewx.tnxjee.webmvc.menu;

import java.util.Collection;
import java.util.List;

import org.springframework.security.core.GrantedAuthority;
import org.truenewx.tnxjee.model.spec.menu.Menu;

/**
 * 菜单解决器
 *
 * @author jianglei
 */
public interface MenuResolver {

    /**
     * @return 全部完整菜单清单
     */
    List<Menu> getFullMenus();

    /**
     * 获取指定名称的完整菜单，用于提供赋权时的可选范围
     *
     * @param name 菜单名称，为空时表示默认菜单
     * @return 完整菜单
     */
    Menu getFullMenu(String name);

    /**
     * 获取指定名称的菜单下已获指定权限集的菜单
     *
     * @param name               菜单名称，为空时表示默认菜单
     * @param grantedAuthorities 已获权限集
     * @return 已获权的菜单
     */
    Menu getGrantedMenu(String name, Collection<? extends GrantedAuthority> grantedAuthorities);

    /**
     * 从所有菜单中获取已获指定权限集的菜单项集
     *
     * @param grantedAuthorities 已获权限集
     * @return 已获权的菜单项集
     */
    List<Menu> getGrantedMenus(Collection<? extends GrantedAuthority> grantedAuthorities);

    /**
     * 从指定的全量菜单中过滤出已获指定权限集的菜单
     *
     * @param fullMenu           全量菜单
     * @param grantedAuthorities 已获权限集
     * @return 已获权的菜单
     */
    Menu filterGranted(Menu fullMenu, Collection<? extends GrantedAuthority> grantedAuthorities);

}
